package myself.study.network.tcp.examples.ex03;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import org.junit.Test;

/**
* @Name: FileUploadClient
* @Description: 案例三：文件上传客户端
* 注意：
* 	读取文本文件可以以null作为结束标记进行判断，但是tcp传输通道内不能这样判断。
* 解决：
* 	1、文件传输完毕后，再多写一条数据，自定义为文件的结束标记，告诉服务器，当读取到这个标记时说明文件上传完毕。
* 	2、使用Socket类提供的正常结束标记
* 		public void shutdownOutput() 禁用此套接字的输出流。对于 TCP 套接字，任何以前写入的数据都将被发送，并且后跟 TCP 的正常连接终止序列。
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-12 下午9:18:27 
* @Version: V1.0
 */
public class FileUploadClient {
	
	@Test
	public void client() throws UnknownHostException, IOException {
		//创建客户端Socket对象
		Socket client = new Socket("127.0.0.1", 12345) ;
		//创建文件输出流对象，并包装成高效缓冲读取字符流
		BufferedReader reader = new BufferedReader(new FileReader("D:\\keyword.txt")) ;
		//获取输入流对象，并包装成高效缓冲写入字符流
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())) ;
		String line = null ;
		while((line = reader.readLine()) != null) {
			writer.write(line) ;
			writer.newLine() ;
			writer.flush() ;
		}
		//自定义文件结束标记
		//writer.write("over") ;
		//writer.newLine() ;
		//writer.flush() ;
		//使用Socket类提供的正常结束标记
		client.shutdownOutput() ;
		//接收服务端响应结果
		BufferedReader reader2 = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
		String status = reader2.readLine() ; //阻塞
		System.out.println(status);
		//释放资源
		reader.close() ;
		client.close() ;
	}

}

















